#!/usr/bin/env node

/**
 * 数据库查询工具
 * 用于查看和统计爬取结果
 * 
 * 用法：
 *   node query-database.js                    # 查看最近的 10 条记录
 *   node query-database.js --all              # 查看所有记录
 *   node query-database.js --task amazon-de   # 查看指定任务的记录
 *   node query-database.js --success          # 查看成功的记录
 *   node query-database.js --failed           # 查看失败的记录
 *   node query-database.js --stats            # 查看统计信息
 *   node query-database.js --batch <id>       # 查看指定批次的记录
 */

const dbConnection = require('./db/connection');
const CrawlResult = require('./db/models/CrawlResult');
const config = require('./tasks.config');

// 解析命令行参数
function parseArgs() {
    const args = process.argv.slice(2);
    const options = {
        action: 'recent',
        limit: 10,
        taskName: null,
        batchId: null,
        success: null
    };

    for (let i = 0; i < args.length; i++) {
        const arg = args[i];

        if (arg === '--all' || arg === '-a') {
            options.action = 'all';
            options.limit = 0;
        } else if (arg === '--stats' || arg === '-s') {
            options.action = 'stats';
        } else if (arg === '--task' || arg === '-t') {
            options.taskName = args[++i];
        } else if (arg === '--batch' || arg === '-b') {
            options.batchId = args[++i];
        } else if (arg === '--success') {
            options.success = true;
        } else if (arg === '--failed' || arg === '--fail') {
            options.success = false;
        } else if (arg === '--limit' || arg === '-l') {
            options.limit = parseInt(args[++i]) || 10;
        } else if (arg === '--help' || arg === '-h') {
            console.log(`
数据库查询工具

用法：
  node query-database.js [选项]

选项：
  -a, --all              查看所有记录
  -t, --task <名称>      查看指定任务的记录
  -b, --batch <ID>       查看指定批次的记录
  --success              只查看成功的记录
  --failed, --fail       只查看失败的记录
  -s, --stats            显示统计信息
  -l, --limit <数量>     限制显示的记录数量（默认：10）
  -h, --help             显示帮助信息

示例：
  node query-database.js                        # 查看最近 10 条记录
  node query-database.js --all                  # 查看所有记录
  node query-database.js --task amazon-de       # 查看亚马逊德国任务的记录
  node query-database.js --success --limit 20   # 查看最近 20 条成功记录
  node query-database.js --stats                # 查看统计信息
            `);
            process.exit(0);
        }
    }

    return options;
}

// 格式化显示记录
function displayRecords(records) {
    if (records.length === 0) {
        console.log('没有找到记录');
        return;
    }

    console.log('\n' + '='.repeat(80));
    console.log(`找到 ${records.length} 条记录`);
    console.log('='.repeat(80));

    records.forEach((record, index) => {
        console.log(`\n${index + 1}. ${record.taskName || '未知任务'}`);
        console.log(`   状态: ${record.success ? '✅ 成功' : '❌ 失败'}`);
        console.log(`   URL: ${record.url || 'N/A'}`);
        console.log(`   标题: ${record.title || 'N/A'}`);
        console.log(`   爬取时间: ${record.crawlTimestamp ? new Date(record.crawlTimestamp).toLocaleString('zh-CN') : 'N/A'}`);
        console.log(`   批次 ID: ${record.batchId || 'N/A'}`);
        console.log(`   执行模式: ${record.executionMode || 'N/A'}`);
        
        if (!record.success && record.error) {
            console.log(`   错误: ${record.error}`);
        }
        
        if (record.data) {
            const dataPreview = JSON.stringify(record.data).substring(0, 100);
            console.log(`   数据预览: ${dataPreview}...`);
        }
    });

    console.log('\n' + '='.repeat(80));
}

// 显示统计信息
async function displayStats() {
    console.log('\n' + '='.repeat(80));
    console.log('📊 数据库统计信息');
    console.log('='.repeat(80));

    // 总记录数
    const totalCount = await CrawlResult.countDocuments();
    console.log(`\n总记录数: ${totalCount}`);

    // 成功/失败统计
    const successCount = await CrawlResult.countDocuments({ success: true });
    const failureCount = await CrawlResult.countDocuments({ success: false });
    console.log(`成功: ${successCount} (${totalCount > 0 ? (successCount / totalCount * 100).toFixed(1) : 0}%)`);
    console.log(`失败: ${failureCount} (${totalCount > 0 ? (failureCount / totalCount * 100).toFixed(1) : 0}%)`);

    // 按任务统计
    const taskStats = await CrawlResult.aggregate([
        { $group: { _id: '$taskName', count: { $sum: 1 }, successCount: { $sum: { $cond: ['$success', 1, 0] } } } },
        { $sort: { count: -1 } }
    ]);

    if (taskStats.length > 0) {
        console.log('\n按任务统计:');
        taskStats.forEach(stat => {
            const successRate = stat.count > 0 ? (stat.successCount / stat.count * 100).toFixed(1) : 0;
            console.log(`  ${stat._id || '未知'}: ${stat.count} 条 (成功率: ${successRate}%)`);
        });
    }

    // 按批次统计
    const batchStats = await CrawlResult.aggregate([
        { $group: { _id: '$batchId', count: { $sum: 1 } } },
        { $sort: { _id: -1 } },
        { $limit: 5 }
    ]);

    if (batchStats.length > 0) {
        console.log('\n最近 5 个批次:');
        batchStats.forEach(stat => {
            console.log(`  ${stat._id || 'N/A'}: ${stat.count} 条`);
        });
    }

    // 最近爬取时间
    const latestRecord = await CrawlResult.findOne().sort({ createdAt: -1 });
    if (latestRecord) {
        console.log(`\n最近爬取时间: ${new Date(latestRecord.createdAt).toLocaleString('zh-CN')}`);
    }

    // 最早爬取时间
    const earliestRecord = await CrawlResult.findOne().sort({ createdAt: 1 });
    if (earliestRecord) {
        console.log(`最早爬取时间: ${new Date(earliestRecord.createdAt).toLocaleString('zh-CN')}`);
    }

    console.log('\n' + '='.repeat(80) + '\n');
}

// 主函数
async function main() {
    console.log('========================================');
    console.log('    数据库查询工具');
    console.log('========================================\n');

    const options = parseArgs();

    try {
        // 连接数据库
        await dbConnection.connect();

        if (options.action === 'stats') {
            // 显示统计信息
            await displayStats();
        } else {
            // 构建查询条件
            const query = {};
            
            if (options.taskName) {
                query.taskName = options.taskName;
            }
            
            if (options.batchId) {
                query.batchId = options.batchId;
            }
            
            if (options.success !== null) {
                query.success = options.success;
            }

            // 查询记录
            let queryBuilder = CrawlResult.find(query).sort({ createdAt: -1 });
            
            if (options.limit > 0) {
                queryBuilder = queryBuilder.limit(options.limit);
            }

            const records = await queryBuilder;
            
            // 显示记录
            displayRecords(records);
        }

    } catch (error) {
        console.error('❌ 查询失败:', error.message);
    } finally {
        // 关闭数据库连接
        await dbConnection.disconnect();
    }
}

// 运行
if (require.main === module) {
    main().catch(console.error);
}

module.exports = main;

